package com.iman.Confucius.repository.impl;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import com.iman.Confucius.repository.IRedisGo;
 

@Repository
public class RedisGoImpl implements IRedisGo {

    private Logger logger = LoggerFactory.getLogger(RedisGoImpl.class);


    @Autowired
    @Qualifier("jedisPool")
    private JedisPool jedisPool;
    
	
	
	 /**
     *  Function:
     *  功能说明：
     *	使用说明：
     *  @author : wangxiaolei  DateTime 2014年3月26日 下午7:19:24
     *	返回类型: Set<String>  
     *	@see com.zhe800.product.db.redis.StockJedis#getMapSubKeys()
     *  @return
     */
     
    @Override
    public Set<String> getMapSubKeys(String base_suffix,String dateStr) {
            Jedis jedis =null;
            try {
                jedis = jedisPool.getResource();
                Set<String> keys = jedis.hkeys( dateStr);
                return keys;
            }catch (Exception e) {
                logger.error("" + e.getMessage());
            } finally {
                jedisPool.returnResource(jedis);
            }
            return null;
    }

    
     
     /**
     *  Function:
     *  功能说明：
     *	使用说明： 获得  PRODUCT_SALES_ 所有的 keys
     *  @author : wangxiaolei  DateTime 2014年3月26日 下午7:23:11
     *	返回类型: Set<String>  
     *	@see com.zhe800.product.db.redis.StockJedis#getMapSubAllKeys()
     *  @return
     */
     
    @Override
    public Set<String> getMapSubAllKeys(String base_suffix) {
            Jedis jedis =null;
            try {
                jedis = jedisPool.getResource();
                Set<String> keys = jedis.keys( base_suffix /*ConstRedis.PRODUCT_SALES_*/+"*");
                return keys;
            }catch (Exception e) {
                logger.error("" + e.getMessage());
            } finally {
                jedisPool.returnResource(jedis);
            }
            return null;
    }

    
     
     /**
     *  Function:
     *  功能说明：放入redis  的 list 中 对尾部
     *	使用说明：
     *  @author : wangxiaolei  DateTime 2014年3月26日 下午8:27:43
     *	返回类型: boolean  
     *	@see com.zhe800.product.db.redis.StockJedis#putList(java.lang.String)
     *  @param json
     *  @return
     */
     
    @Override
    public boolean putList(String key ,String... datas) {
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            if(datas!=null){
                for(String data : datas){
                    jedis.lpush(key , data);
                }
            }
            return true;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

    
     
     /**
     *  Function:
     *  功能说明：获取头部 不删除
     *	使用说明：
     *  @author : wangxiaolei  DateTime 2014年3月26日 下午8:27:43
     *	返回类型: String  
     *	@see com.zhe800.product.db.redis.StockJedis#getList()
     *  @return
     */
     
    @Override
    public String getList(String key ) {
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            String value =   jedis.lindex(key, 0) ;
            return value;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return null;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

    
     
     /**
     *  Function:
     *  功能说明：获取头部  删除
     *	使用说明：
     *  @author : wangxiaolei  DateTime 2014年3月26日 下午8:27:43
     *	返回类型: String  
     *	@see com.zhe800.product.db.redis.StockJedis#popList()
     *  @return
     */
     
    @Override
    public String popList(String key ) {
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            String value =   jedis.lpop(key) ;
            return value;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return null;
        } finally {
            jedisPool.returnResource(jedis);
        }
    
    }

    /*************************** redis map 操作   *******************************/
    
    /*
     * 获取map field 的一个值
     */
    public String  getMap(String mainKey,String subKey){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            
            String productCountStr = jedis.hget(mainKey,  subKey);
         
            return productCountStr;
             }
        catch (Exception e) {
            logger.error("" + e.getMessage());
        } finally {
            jedisPool.returnResource(jedis);
        }
    
        return null;
    };
    /**
     *  Function:
     *  功能说明：上一个Map设置一个值
     *	 使用说明：
     *  @author : wangxiaolei  DateTime 2014年4月9日 下午4:14:00
     *	  返回类型: boolean  
     *	 @see com.zhe800.product.db.redis.StockJedis#putMap(java.lang.String, java.lang.String, java.lang.String)
     *  @param mainKey
     *  @param subKey
     *  @param value
     *  @return
     */
    public boolean  putMap(String mainKey,String subKey,String value){
        Jedis jedis = null;
        Long newCount = (long) 0;
        try {
            jedis = jedisPool.getResource();
            newCount = jedis.hset(mainKey, subKey, value);
            return newCount==null?false:true;
        }
        catch (Exception e) {
            logger.error("" + e.getMessage());
        } finally {
            jedisPool.returnResource(jedis);
        }
        return false;
    };
    
    /**
     *  Function:
     *  功能说明： 删除 map中一个字段
     *	 使用说明：
     *  @author : wangxiaolei  DateTime 2014年4月9日 下午4:13:37
     *	  返回类型: boolean  
     *	 @see com.zhe800.product.db.redis.StockJedis#removeMap(java.lang.String, java.lang.String)
     *  @param mainKey
     *  @param subKey
     *  @return
     */
    public boolean  removeMap(String mainKey,String subKey){
        Jedis jedis = null;
        Long newCount = (long) 0;
        try {
            jedis = jedisPool.getResource();
            newCount = jedis.hdel( mainKey, subKey );
            return newCount==null?false:true;
        }
        catch (Exception e) {
            logger.error("" + e.getMessage());
        } finally {
            jedisPool.returnResource(jedis);
        }
        return false;
    };
     
    
    /************************************************************************************************/
    
    
     
    
    
    /**
     * 
     *  Function:
     *  功能说明：
     *	 使用说明：
     *  @author : wangxiaolei  DateTime 2014年5月17日 上午9:46:21
     *	  返回类型: boolean  
     *	 @see com.zhe800.product.db.redis.StockJedis#setExiperse(java.lang.String, long)
     *  @param key
     *  @param seconds
     *  @return
     */
    @Override
    public boolean setExiperse(String key, int seconds) {
        logger.info( "---------------------setExiperse--------key:"+key+">>>>>>seconds:="+seconds);
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
          long r =  jedis.expire(key, seconds);
          if(r>0){
              logger.info( "----------ok-----------setExiperse--------key:"+key+">>>>>>seconds:="+seconds);
              return true;
          }else{
              return false;
          }
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
        
    };
    
    public boolean  putKV(String key ,String data){
        logger.info( "------putKV ----"+ "---key ----"+key+"----data -------"+data);
        
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            jedis.set(key, data);
            return true; 
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
    };
    
    
    
    public boolean  putKV(String key ,String data,int proi){
        logger.info( "------putKV ----"+ "---key ----"+key+"----data -------"+data);
        
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            jedis.setex(key, proi, data);
            return true; 
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
    };
    
    
    @Override
    public boolean putNxKV(String key, String data) {
        logger.info( "------putKV ----"+ "---key ----"+key+"----data -------"+data);
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
           long set = jedis.setnx( key, data);
            return set>0?true:false; 
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
         
    }

    public String   getKV(String key ){
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            String value = jedis.get(key);
            logger.info( "---getKV--key:="+key+"-----------value:="+value);
            return value;
        }catch (Exception e) {
            logger.error("" + e.getMessage(),e);
            return null;
        } finally {
            jedisPool.returnResource(jedis);
        }
      };
    public String   removeKV(String key ){
       
        Jedis jedis =null;
        try {
            jedis = jedisPool.getResource();
            long s =  jedis.del(key);
            logger.info( "- removeKV  --key="+key +" value:="+s);
            return s+"";
        }catch (Exception e) {
            logger.error( e.getMessage(),e);
            return null;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

    
     
    @Override
    public int incredMap(String mainKey, String subKey,int value) {
        Jedis jedis =null;
        try {
            logger.info("incredMap>>incredMap>>>>>>>>> mainKey:= "+mainKey +">>>>"+subKey+" value:="+value);
            jedis = jedisPool.getResource();
            Long newCount = jedis.hincrBy(mainKey,subKey, value);
            logger.info("incredMap>>incredMap>>>>>>>>> mainKey:= "+mainKey +">>>>"+subKey+" value:="+value+">>>>>result==:"+newCount);
            return  newCount.intValue();
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return -1;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

    /**************************************************************************************************************/
    
    @Override
    public Set<String> getSortSet(String key) {
        Jedis jedis =null;
        try {
            logger.info("getSortSet>>>> key:="+key);
            jedis = jedisPool.getResource();
            Set<String> products = jedis.zrangeByScore(key, 0, System.currentTimeMillis());
            logger.info("  mainKey:= "+key +">>>>"+key+" value:="+products );
            return  products;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return null;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

   /**
    * 获取当前时间权重的 数量
    */
    @Override
    public long    removeSortSet(String key,String... values){
        Jedis jedis =null;
        try {
            logger.info("getSortSet>>>> key:="+key);
            jedis = jedisPool.getResource();
            Long products = jedis.zrem(key, values)   ;
            logger.info("  mainKey:= "+key +">>>>"+key+" value:="+values +" result:="+products);
            return  products;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return 0;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }
    
    /*
     * 当前时间权重的值添加
     * */
    @Override
    public boolean putSortSet(String key, String value) {
        Jedis jedis =null;
        try {
            logger.info("putSortSet>>>> key:="+key+">> value:="+value);
            jedis = jedisPool.getResource();
            Long result = jedis.zadd(key, System.currentTimeMillis(), value);
            logger.info("  mainKey:= "+key +">>>>value="+value+" result:="+result );
            return  true;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }

    /**
     * 设置权重的添加值
     */
    @Override
    public boolean putSortSet(String key, String value, long proi) {
        Jedis jedis =null;
        try {
            logger.info("putSortSet>>>> key:="+key+">> value:="+value);
            jedis = jedisPool.getResource();
            Long result = jedis.zadd(key, proi, value);
            logger.info("  mainKey:= "+key +">>proi:="+proi+">>value="+value+" result:="+result );
            return  true;
        }catch (Exception e) {
            logger.error("" + e.getMessage());
            return false;
        } finally {
            jedisPool.returnResource(jedis);
        }
       
    }



	@Override
	public boolean putMap(String mainKey, Map<String, String> value) {
		 Jedis jedis =null;
	        try {
	            logger.info("putSortSet>>>> value:=" +value);
	            jedis = jedisPool.getResource();
	            String result = jedis.hmset(mainKey, value);
	            logger.info("  mainKey:= "+mainKey + ">>value="+value+" result:="+result );
	            return  "ok".equalsIgnoreCase(result);
	        }catch (Exception e) {
	            logger.error("" + e.getMessage());
	            return false;
	        } finally {
	            jedisPool.returnResource(jedis);
	        }
	}



	@Override
	public Map<String, String> getMap(String mainKey) {
		 Jedis jedis =null;
	        try {
	            logger.info("putSortSet>>>> value:=" +mainKey);
	            jedis = jedisPool.getResource();
	            Map<String, String> result = jedis.hgetAll( mainKey );
	            logger.info("  mainKey:= "+mainKey  +" result:="+result );
	            return result;
	        }catch (Exception e) {
	            logger.error("" + e.getMessage());
	            return null;
	        } finally {
	            jedisPool.returnResource(jedis);
	        }
	}

}
